--lua script

thisNPC = nil
InitFnTable = {}
FinaFnTable = {}

local LocalDT={}

--这个文件是所有的怪物相关的脚本逻辑的总函数
--包括怪物的死亡，怪物的刷新处理的一些逻辑的入口在这里

--#include "LogIds.lua" once     --脚本日志ID定义
--#include "data\envir\FuBenTongGuan.lua" once		--副本通关条件的定义，这里包含是为了注册副本中出现的怪物的死亡事件
	--#include "data\envir\FubenBossSelect.lua" once		--爬塔副本怪

--#include "MonEvent\MDCDispatcherImplement.lua" once
--#include "MonEvent\MonsterMobDispatchImpl.lua" once 
--#include "MonEvent\MonsterLiveTimeOutDispatchImpl.lua" once 

--#include "MonEvent\FBMonsters\FBMonstersInclude.lua" once
--#include "MonEvent\AtvMonsters\AtvMonstersInclude.lua" once
--#include "MonEvent\QuestMonsters\QuestMonsterFunc.lua" once
--#include "data\config\quest\QuestMonster.lua" once
--#include "data\functions\player.lua" once -- 角色处理
--#include "data\functions\GlobalDefine.lua" once -- 协议


--#include "MonEvent\MonsterEventCommon.lua" once
--[[
killer首次击杀某怪物某怪物后是否掉落
]]
function CheckAndSetIsDropItemWhenMonsterKilled(monster, killer, monId)
	local isDropOneTimes = OneTimesDropMonsters[monId]
	if isDropOneTimes == nil then return true end
	
	--该怪只在第一次击杀时掉落
	--if killer == nil then return true end
	--不是玩家
	if Actor.getEntityType(killer) ~= 0 then return true end
	
	local svar = Actor.getStaticVar(killer);
	if svar.DropOneTimes == nil then
		svar.DropOneTimes = {}
		svar.DropOneTimes[monId] = true
		return true
	elseif svar.DropOneTimes[monId] == nil then
		svar.DropOneTimes[monId] = true
		return true	
	end
	return false
end

--[[当一个怪物被杀死的时候回调
每次怪物死亡都会触发此方法，影响服务器性能
尽量不要使用此方法,渐渐淡化此方法
]]
function HandlerMonsterByKilled(monster, killer, monId, fubenId, sceneId, fuBenPtr)
	-- 处理怪物被杀（各自功能的怪物击杀逻辑在各自文件中写）（不需要这种机制）
	--OnMonsterByKilled(monster, killer, monId, fubenId, sceneId, fuBenPtr)

	-- 副本通关判断（不需要这种机制）
	--MonDieDispatcher.CommonDieFunc(monster, killer, monId)
	
	-- 返回值： 杀死该怪物后是否要掉落物品(true:掉落；false:不掉)
	local isDropItem = CheckAndSetIsDropItemWhenMonsterKilled(monster, killer, monId)
	return isDropItem
end

function HandlerMonsterByTeamMenber(killer,monId)
	OnMonsterByTeammeta(killer,monId)
end

--[[当一个怪物被杀死的时候（bDeathTriggerScript配置为true时才会回调）
	Killer:归属玩家
	lastHitKiller：最后一击玩家
]]
function OnMonsterKilled(monster, killer, monId, lastHitKiller)
	--print("OnMonsterKilled, monId="..monId)
	MonDieDispatcher.dispatch(monster, killer, monId, lastHitKiller)  
end

--[[
怪物死亡触发（仅针对BOSS）
]]
function OnMonsterDeath(monster, monId)
	--print("OnMonsterDeath, monId="..monId)
	MonDeathDispatcher.dispatch(monster, monId)  
end


--当一个怪物刷新出来的时候的时候调用
function OnMonsterMob(monster,monId, sceneId,x,y)
   MonMobDispatcher.dispatch(monster, monId, sceneId,x,y)
end

--当一个怪物刷生命周期的时候的时候调用
function OnMonsterLiveTimeOut(monster, monId, sceneId)
	--print("OnMonsterLiveTimeOut, monId=",monId)
    MonLiveTimeOutDispatcher.dispatch(monster, monId, sceneId)
end



for k,v in pairs(MonsterForQuest) do
	if v ~= nil then
		for j = 1, #v do
			MonDieDispatcher.register(k,MonDieDispatcher.QuestDieFunc)
		end
	end
end

for monsId, questList in pairs(ShareHitMonsterForQuest) do
	for idx, questId in ipairs(questList) do
		MonDieDispatcher.register( monsId,MonDieDispatcher.ShareHitQuestDieFunc)
	end
end


--[[初始化函数]]--
function initialization(npcobj)
	thisNPC = npcobj
	for i = 1, table.getn(InitFnTable) do
		InitFnTable[i]( npcobj )
	end
end

--[[析构化函数]]--
function finalization(npcobj)
	for i = 1, table.getn(FinaFnTable) do
		FinaFnTable[i]( npcobj )
	end
	thisNPC = nil
end

FreshCommonBossWhenStart()			--放在这里，确保先注册事件，再刷出BOSS (@rsf时，不会执行）
